Verify preorder sequence in binary search tree [BST]¶
Time: O(N); Space: O(1); medium
Given an array of numbers, verify whether it is the correct preorder traversal sequence of a Binary Search Tree.
You may assume each number in the sequence is unique.
Example 1:
5
/ \
2 6
/ \
1 3
Input: [5,2,6,1,3]
Output: False
Example 2:
5
/ \
2 1
/ \
3 6
Input: [5,2,1,3,6]
Output: True
Follow up:
Could you do it using only constant space complexity?
[5]:
class Solution1(object):
"""
Time: O(N)
Space: O(1)
"""
def verifyPreorder(self, preorder):
'''
:type preorder: int
:rtype: bool
'''
low, i = float("-inf"), -1
for p in preorder:
if p < low:
return False
while i >= 0 and p > preorder[i]:
low = preorder[i]
i -= 1
i += 1
preorder[i] = p
return True
[6]:
s = Solution1()
preorder = [5,2,6,1,3]
assert s.verifyPreorder(preorder) == False
preorder = [5,2,1,3,6]
assert s.verifyPreorder(preorder) == True
[7]:
class Solution2(object):
"""
Time: O(N)
Space: O(N)
"""
def verifyPreorder(self, preorder):
"""
:type preorder: int
:rtype: bool
"""
low = float("-inf")
path = []
for p in preorder:
if p < low:
return False
while path and p > path[-1]:
low = path[-1]
path.pop()
path.append(p)
return True
[8]:
s = Solution2()
preorder = [5,2,6,1,3]
assert s.verifyPreorder(preorder) == False
preorder = [5,2,1,3,6]
assert s.verifyPreorder(preorder) == True